\chapter{Мультимедиа}
\pagenumbering{arabic}

\section{MOCP}
Время от времени нужно выходить в консоль и гасить иксы - для изменения иксовых же настроек или обновлений, связанных с иксовыми пакетами. И сидеть в это время в тишине совсем не хочется. Конечно, можно запустить XMMS на ноутбуке и проигрывать музыку оттуда, но есть решение лучше: MOCP. 

Управляется горячими клавишами, и основные клавиатурные сокращения такие:

\begin{enumerate}
\item ENTER - переключиться в директорию и/или начать воспроизведение песни
\item o - проиграть URL (например, интернет-радиостанции)
\item p или пробел - пауза
\item s - стоп
\item l - переключиться между одно- и двухпанельным режимом
\item a - добавить текущий файл в список воспроизведения
\item A - добавить текущую директорию в список воспроизведения
\item C - очистить список воспроизведения
\item q - отключить консольный интерфейс (сервер MOC будет продолжать воспроизведение, к нему можно подключиться снова, набрав mocp)
\item Q - отключение MOC-сервера (прекращение воспроизведения)
\end{enumerate}


Так же можно воспользоваться более широкими возможностями по управлению плеером с помощью следующих клавиатурных сокращений:

\begin{enumerate}
\item n -- проиграть следующую песню из списка
\item b -- проиграть предыдущую песню из списка
\item S -- воспроизведение в произвольном порядке
\item R -- повторяет выбранную песню циклически
\item u -- перемещает элемент списка воспроизведения вверх
\item j -- перемещает элемент списка воспроизведения вниз
\item g или / -- ищет заданную строку в именах фалов песен
\item r -- перечитать директорию заново
\item f -- переключить режим отображения с имён файлов на теги
\item TAB -- переключение между списком воспроизведения и файлами песен
\item H -- показывает скрытые файлы
\item Ctrl-t -- показать или убрать длительность песни в списке
\item Ctrl-f -- показать или убрать формат песни
\item U -- переместиться на уровень выше в директории
\item a -- добавить файл к списку воспроизведения
\item A -- добавить каталог к списку воспроизведения
\item C -- очистить список воспроизведения
\item V -- сохранить список воспроизведения
\item d -- удалить отмеченные песни из списка воспроизведения
\end{enumerate}

Наконец, управление громкостью
\begin{enumerate}
\item < -- уменьшить громкость на 1\%
\item , -- уменьшить громкость на 5\%
\item >- увеличить громкость на 1\%
\item .  увеличить громкость на 5\%
\end{enumerate}
Если вы запамятовали какую-нибудь команду, то получить справку по клавиатурным сокращениям можно клавишей "?"

Язык осин и берёз MOCP по умолчанию отображает славяно-греко-латинской мешаниной, что легко поправить. Для этого копируем пример конфига отсюда:

\begin{lstlisting}
$ cp /usr/share/doc/moc/examples/config.example.gz ~/.moc/
$ cd ~/.moc
# chown $USER config.example.gz
\end{lstlisting}

Где \verb+$USER+ - имя пользователя в системе. После этого разархивируем конфиг:

\begin{lstlisting}
$ gunzip config.example.gz
$ mv config.example config
\end{lstlisting}

И правим его своим любимым текстовым редактором. Чтобы заставить MOCP дружить с кириллицей в ID3v1-заголовках, необходимо найти строку:

\begin{lstlisting}
#ID3v1TagsEncoding = WINDOWS-1250
\end{lstlisting}


и превратить ее в

\begin{lstlisting}
ID3v1TagsEncoding = WINDOWS-1251
\end{lstlisting}

И всё, играй, гармонь!





\section{Немного о lossless кодировании видео в Linux }
Некоторое время назад была потребность в том, чтобы сжать видеофайл без потерь в Linux (lossless compression) и воспроизводить сжатый фильм без пропуска кадров. 

\subsection{Сжимаем видео с помощью Mencoder}
Для этого мы отобрали пару кодеков с lossless и начали сжимать наш видеоролик. Исходно в нашем распоряжении был видеоролик размером 341 Мб, в котором полутоновая картинка перемещалась по экрану. Нужно было сжать без потерь ролик так, чтобы он и места занимал немного, и воспроизводился без торможений.


\subsubsection{Сжатие FFV1}
Сначала сжимали кодеком FFV1 командой:
\begin{lstlisting}
$ mencoder -ovc lavc -lavcopts vcodec=ffv1 video-before.avi -o video-compressed-ffv1.avi
\end{lstlisting}

Сжалось до 18Мб, что очень хорошо. Однако при попытке такой сжатый файл воспроизвести, возникли проблемы: Mplayer (как и другие) сильно грузит процессор и видео не успевает воспроизводиться с заданным FPS. О том, какие страдания были с воспроизведением и как мы их героически решали, будет сказано ниже.


\subsubsection{Сжатие huffyuv}
Ещё один метод сжатия без потерь, но жмёт он хуже, чем FFV1, зато быстрее воспроизводится и меньше грузит процессор. При этом использовали mencoder для сжатия huffyuv с параметрами:
\begin{lstlisting}
$ mencoder -ovc lavc -lavcopts vcodec=ffvhuff:vstrict=-1:pred=2:context=1:format=422p video-before.avi -o video-compressed-ffvhuff.avi
\end{lstlisting}

Получилось видео на 99Мб, что тоже неплохо. Однако при воспроизведении оказалось, что происходит конвертирование в другое цветовое пространство 420p и мы решили отказаться от такого финта:
\begin{lstlisting}
$ mencoder -ovc lavc -lavcopts vcodec=ffvhuff:vstrict=-1:pred=2:context=1 video-before.avi -o video-compressed-ffvhuff-420.avi
\end{lstlisting}

при этом сэкономили ещё почти 20 Мб - фильм стал занимать 80Мб и воспроизводиться чуть глаже.

Остановившись на сжатии huffyuv без опции format=422p, мы стали перебирать варианты воспроизведения видео с минимальными тормозами. История на этом не кончается...


\subsection{Воспроизведение видео с помощью Mplayer}
Видео у нас сжато слабо, воспроизводить надо без задержек и железо скажем сразу весьма чахлое. Как проигрывать видео в таких условиях?

Перво-наперво, используем замечательные возможности Mplayer по выводу видео куда и на что угодно: поэкспериментировать с параметром -vo было здравой идеей, и через некоторое время мы остановились на варианте -vo gl и -vo sdl для нашей задачи. Однако иксы - это хорошо, но хочется выводить видео на чёрный экран без всяких засветок.

Далее, чтобы отвязаться от дисковой подсистемы как можно больше, используем возможность Mplayer кешировать видео:
\begin{lstlisting}
$ mplayer -vo gl -cache 65535 -cache-min 98 video-compressed-ffvhuff.avi
\end{lstlisting}

Это значит, что мы просим сделать Mplayer кеш на 64Мб и заполнять его не менее чем на 98\%. Это сильно помогло делу, но это ещё не всё.

Условия нашей задачи в меру экзотические: нужно проигрывать видео без масштабирования, "как есть", и желательно на чёрном экране без фона, с максимально возможной плавностью. Всё осложняется тем, что компьютер, на котором видео будет воспроизводиться, управляется Windows, и Linux там можно задействовать только в режиме LiveCD.

Идём дальше и привлекаем для наших нужд Knoppix. В арсенале его параметров загрузки есть неприметный параметр fb1280x1024 для работы с framebuffer. Замечательное дело, и мы решили этим воспользоваться. У нас теперь появилась графическая консоль, чёрная и мрачная, как полярная ночь.

Теперь, чтобы воспроизвести сжатое нами видео, копируем видео в память на Knoppix в каталог Desktop. После этого воспроизводим наше многострадальное видео в консоли так:
\begin{lstlisting}
$ mplayer -vo fbdev -cache 65535 -cache-min 98 -quiet video-compressed.avi
\end{lstlisting}

Ключик -quiet нужен для того, чтобы при воспроизведении Mplayer не выводил статистику в бегущей строке. Всё, после этого получаем фильм на чёрном экране, который воспроизводится плавно и без затей.

\subsection{Скорость воспроизведения в Mplayer}
На всякий случай, если потребуется запускать фильм с другой скоростью, всегда можно попросить Mplayer изменить число кадров в секунду (вплоть до 1 кадра в секунду) так:
\begin{lstlisting}
$ mplayer -fps 1 video-compressed.avi
\end{lstlisting}

Эта команда будет воспроизводить фильм со скоростью 1 кард в секунду.



\section{Видеозахват и сжатие видео в Linux}
С появлением устройств видеозахвата возникает необходимость в программном обеспечении, которое способно записывать видео или отдельные кадры через определённый промежуток времени. Всё это может быть решено открытыми программами, входящими в Debian Linux.

\subsection{Запись видеопотока с устройств захвата на примере ТВ Тюнера}
Большинство программ просмотра телепередач, например tvtime, умеют только просматривать программы и снимать скриншоты. Но время от времени требуется и записывать передачи, особенно когда они идут в неподходящее время. Для этого, в соответсвии с UNIX way, есть другие утилиты. Одна из них называется streamer.
\begin{lstlisting}
# aptitude install streamer
\end{lstlisting}


После того, как пакет streamer будет установлен, он сможет писать и снимать скриншоты из из /dev/video0 и /dev/dsp в картинки jpeg, png и в видеофайлы со звуком. И ролики пишет, и скриншоты делает (в том числе несколько через равные промежутки времени). Программа,
естественно, консольная, так что завернуть её в скрипт труда не
составит.

Для подробной справки у streamer есть очень хороший ключик, который называется -h. Справка написана очень толково, с примерами и простым языком.
Программа пишет в файл заданного имени данные с указанного тюнера, в формате raw и с разными типами компрессии, с заданным числом кадров в секунду и проч.

Вот, например, мой скрипт на bash:
\lstset{language=Bash}
\begin{lstlisting}
#! /bin/sh

if [ -z $1 ]; then
 kmvTimeToRecord=50;
else
 kmvTimeToRecord=$1;
fi

streamer -o ~/movie.avi -r 24 -f mjpeg -j 90 -s 720x520 -F mono8 -t $kmvTimeToRecord:00 -p2
\end{lstlisting}


Скрипт пишет в файл movie.avi 120 минут телепрограммы с тюнера (если время не передано скрипту явно) 24 кадра в секунду с mpeg-компрессией и в полном формате 720x520 и восьмибитным звуком.
Включение скрипта в нужное время осуществляется командой at, позволяющей выполнять любые задания в указанное пользователем время. Это ещё раз иллюстрирует мощь UNIX-way: несколько мелких программ можно связывать в цепочку для получения нужного результата.


\subsection{Сжатие видеоданных}
Если вы будете захватывать в jpeg-сжатии для экономии места, качество будет посредственным, а если в rawvideo rgb15, то минута видео займёт гигабайт. И тут потребуется сжать видеопоток...
Естественное желание - всё это как-то скомпрессировать. Есть несколько программ данного класса: например ffmpeg и mencoder.


\subsection{Пример с ffmpeg}
Установим ffmpeg из стандартного дистрибутива Дебиан. После её установки у нас появляется возможность задавать множество параметров для пережатия захваченного видео с тюнера в MPEG4 с хорошим сжатием и неплохим качеством. Дабы не утомлять читателя man ffmpeg (а он там действительно впечатляющий), привожу свой башевский скрипт, настройки которого более или менее разумны:

\begin{lstlisting}
#! /bin/sh
ffmpeg -i movie.avi -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 new.avi
\end{lstlisting}
\lstset{language=}


Этот скрипт вызывает ffmpeg и указывает сжать файл movie.avi в новый, new.avi, с кодеком mpeg4 и хорошим качеством. Пережатие - долгая операция, так что можно за это время выпить чашечку любимого напитка или даже принять ванну.


\subsection{Пример с mencoder}
Входящая в комплект вместе с Mplayer, утилита mencoder так же очень здорово сжимает видеоданные, в том числе с ТВтюнера. Вот пример с настройками, дающие удовлетворительное качество видеоизображения для просмотра:

\begin{lstlisting}
$ mencoder movie.avi -o new.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4:mbd=1:vbitrate=1800 -ofps 24
\end{lstlisting}


При этом перекодируется входной файл movie.avi в новый файл, new.avi с визуально удовлетворительным качеством. Чтобы каджый раз не вбивать параметры в командную строку добавил профили в mencoder.conf, например так:

\begin{lstlisting}
[ppc]
profile-desc="ppc"
vf=scale=320:240
oac=mp3lame=1
lameopts=mode=3:cbr=1:br=48
ovc=lavc=1
lavcopts=vcodec=mpeg4:vbitrate=270
ffourcc=DIVX
\end{lstlisting}


Для уменьшения размера с точными пропорциями можно vf=scale=320:240 заменить на

\begin{lstlisting}
vf=scale=1
zoom=1
xy=320
\end{lstlisting}


Теперь видео будет иметь ширину 320, а высота будет просчитана автоматически с соблюдением пропорций.


\section{Установка Mplayer в Linux}
Cобрать Mplayer в Linux на примере Debian Linux и установить кодеки для Mplayer.

\subsection{Подготовка}
Идём на официальный сайт и скачиваем там архив с программой и, кроме того, архивы с кодеками (они обычно называются essential*.tar.bz2 или вроде того). После скачивания всего добра оттуда готовим систему для установки: нужен компилятор и несколько дополнительных пакетов. Для сборки плеера из исходников нам нужно поставить пакеты:

\begin{lstlisting}
# apt-get install gcc g++ make
\end{lstlisting}


После этого ставим необходимые для MPlayer пакеты.

Некоторые пакеты могут быть уже установлены, другие потребуют обновлённых версий, но набор их остаётся прежним. Далее переходим в каталог /usr/src и создаём там каталог mplayer, где и будем его собирать. Всё почти готово...


\subsection{Сборка MPlayer в Debian Linux - консольный плеер}
Переходим в каталог с исходниками MPlayer и разархивируем их в каталог:

\begin{lstlisting}
# cd /usr/src/mplayer/ && tar -jxvvf * && cd *
\end{lstlisting}


После этого в этом же каталоге набираем:

\begin{lstlisting}
# ./configure
\end{lstlisting}


Поползуют выводы конфигуратора: что у вас есть и с поддержкой чего будет компилироваться MPlayer. Если его на этом этапе что-то не устроит - он вылетит и перед кончиной скажет, чего ему не хватило для полного счастья. Недостающее надо поставить, после чего собрать-таки пакет прописыванием следующего заклинания:

\begin{lstlisting}
# DEB_BUILD_OPTIONS="--disable-runtime-cpu
    detection" fakeroot debian/rules binary
\end{lstlisting}


Вот прямо так и пишите, как здесь, и должно быть вам счастье. По экрану поползут и замелькают строчки компилятора, в которые вчитываться не обязательно. Апофеозом его деятельности будет появившийся в каталоге /usr/src/mplayer заветный файлик mplayerVersion.deb, который мы ставим утилитой dpkg следующим манером:

\begin{lstlisting}
# dpkg -i mplayerVersion.deb
\end{lstlisting}


Но это ещё не всё: у нас только основные кодеки, а дополнительных нет, и разные неправильные ролики мы не увидим. А хотим. Но разве напрасно мы качали кодеки к MPlayer вида all-*.tar.bz2 и essential-*.tar.bz2? Сейчас мы их поставим.


\subsection{Установка Mplayer кодеков в Linux}
Отвечаю на вечный вопрос убунтуйцев и сусеводов - как поставить кодеки Mplayer. Скачиваем архив с кодеками Mplayer, разархивируем кодеки Mplayer и все их сваливаем в каталог /usr/lib/win32 - если такого каталога нет, создаём его.
Теперь (заделываясь рутом или его полномочиями через sudo) идём в каталог /etc и редактируем там файл ld.so.conf вписыванием в него строк:

\begin{lstlisting}
/usr/lib
/usr/lib/win32 
\end{lstlisting}


Вот как например этот файл выглядит у меня (это только пример!)

\begin{lstlisting}
# cat /etc/ld.so.conf

/usr/X11R6/lib
/usr/lib/atlas
/usr/lib
/usr/lib/win32
\end{lstlisting}



Вот только после этого действа у меня появились кодеки - и увидел их не только MPlayer, но и Xine, что приятно вдвойне. Так что теперь кодеками Mplayer будут пользоваться оба плеера.

\subsection{Использование консольного MPlayer - основные команды}
Сейчас вы освоите такую экзотику, как консольный плеер. Это просто и при некотором навыке гораздо быстрее графического. Организую это в виде FAQ:

\subsubsection{Как посмотреть фильм, который находится в каталоге /home/vasya/porno.avi?}
В графической консольке (Терминал, xterm или как она у вас называется) набираем: mplayer /home/vasya/porno.avi

\subsubsection{Фильм идёт, но много жрёт процессорного времени}
 (вариант: только в центральной части экрана, а когда разворачиваешь fullscreen - фильм продолжает идти не на весь экран) - что можно сделать? Попробовать другие методы видеовывода, указав плееру параметр:
mplayer -vo xv /home/vasya/porno.avi И попробовать другие ключи:
\begin{lstlisting}
-vo sdl
-vo xv -vo x11
-vo gl
-vo gl2 
 \end{lstlisting}
а так же другие, которыми плеер поделится, если его попросить: mplayer -vo help

\subsubsection{Фильм идёт рывками, пропуск кадров виден нетрезвым/невооружённым глазом, что делать?}
а) попробовать предыдущий рецепт (п.2) и поменять параметр видеовывода, особенно помогает sdl;
б) указать параметр -framedrop или -hardframedrop при которых плеер пытается воспроизводить фильм в максимально пристойном качестве с пропуском кадров;
в) подымать framebuffer, выгружать иксы и смотреть фильмы в чистой консоли (для упёртых фанатов) или
г) обновить своё железо.

\subsubsection{Хочется выводить фильм на второй монитор (который в режиме clone/dualhead), а оно играет только на одном мониторе - куда копать?}
В тот же пункт.2 и менять видеовывод указанием параметра видеовывода. Рецептов тут дать нельзя - только перебором возможных вариантов. Например, для ЗлаХП и видеокарты ATi RadeonX300 одновременный вывод на двух мониторах наблюдался при указании:
mplayer -vo gl /home/vasya/porno.avi
Вывод фильма был, а ЗлоМедиаПлеер нервно курил в сторонке :-)

\subsubsection{Хочу подкрутить яркость/контраст/насыщенность, а на какие кнопки жать в консольном плеере?}
На клавиатурные, натурально, о чём, кстати, в man mplayer подробно растолковано. Но для тех, кто мануалов не читает, привожу перевод:

\begin{framed}
\begin{verbatim}    Кнопки 1 и 2 понижают/повышают контраст
    Кнопки 3 и 4 понижают/повышают яркость
    Кнопки 5 и 6 понижают/повышают оттенки
    Кнопки 7 и 8 понижают/повышают насыщенность
\end{verbatim}
\end{framed}


Не все эти операции поддерживаются различными методами видеовывода.

\subsubsection{Видео и звук рассинхронизируются - как компенсировать?}
Снова мучаем клавиатуру:

\begin{framed}
\begin{verbatim}
    кнопка + и - компенсировать назад/вперёд 
десинхронизацию на 0.1 секунд
    или прописать параметр -autosync 0
\end{verbatim}
\end{framed}



\subsubsection{У видеофайла неправильное соотношение сторон (не правильный aspect ratio) - как компенсировать?}
В консоли запускаем mplayer c параметром -monitoraspect X:Y где вместо X и Y подбираем правильные соотношения экспериментально. Полная строка может выглядеть так: mplayer -monitoraspect 4:4 1984.mpg



\section{Мультимедийные клавиши и кнопки в Linux}
Многие современные клавиатуры комплектуются разного рода мультимедийными клавишами и мультимедийными кнопками для управления плеерами и броузерами.


\subsection{Коды мультимедийных клавиш}
Прежде, чем мы начнём настраивать мультимедийные кнопки, нужно узнать, видят ли иксы эти самые мультимедийные клавиши - потом нам эта информация очень пригодится. Сделать это просто, стандартными средствами иксов - программой xev.

Запускаем консольку xterm (или другую, которая больше нравится), пишем в ней xev (от пользователя). Появится белое окошко, которое будет регистрировать всё, что происходит с мышью (в нём можно перетаскивать чёрный прямоугольник, но это детали). Пробуем нажимать клавиши и смотрим, что получается. Например, жмём на кнопку Down, должны увидеть вот что:

\begin{lstlisting}
KeyRelease event, serial 32, synthetic NO, window 0xe00001, root 0x4c, subw 0x0, time 8095640, (-57,293), root:(753,322), state 0x0, keycode 104 (keysym 0xff54, Down), same_screen YES, XLookupString gives 0 bytes:
\end{lstlisting}


То, что написано после keycode, и есть код клавиши (выделение - моё). Пробуем нажать и отпустить мультимедийную кнопку - если видим какой-нибудь keycode, радуемся. Осталось только поставить соответствующий софт, чем и займёмся.

\subsection{Софт для использования мультимедийных кнопок}
Чтобы зашедшие сюда ассы меня не закидали тухлыми овощами, скажу сразу: да, есть метод, который позволяет подключить горячие клавиши через правку xmodmaprc - но я пугать новичков им не буду.

Итак, в Debian Linux есть единственная программа, которая позволяет комфортно использовать в Иксах мультимедийные кнопки:

\begin{lstlisting}
hotkeys - A hotkeys daemon for your Internet/multimedia keyboard in X 
\end{lstlisting}


Ставим:

\begin{lstlisting}
# apt-get install hotkeys 
\end{lstlisting}


Отлично, теперь запускаем её, указывая параметр клавиатуры:

\begin{lstlisting}
$ hotkeys -t btc8190
\end{lstlisting}


Предопределённых конфигов довольно много, но они друг от друга отличаются только тем, какие коды клавиш определены для каких действий. Поэтому идём в каталог /usr/share/hotkeys и смотрим, какой конфиг (по содержимому) нам ближе. Его можно и нужно редактировать под свою клавиатуру и потребности. На код клавиши можно поставить всё, что угодно. Например, мне удобно управлять только плеером с клавиатуры (у меня Dialog KP-105UH), поэтому я напряг xev на предмет кодов клавиш мультимедиа, поправил конфиг и вот что получилось:
А вот собственно текст конфига:

\lstset{language=XML}
\begin{lstlisting}
<?xml version="1.0"?>

<definition>

<config model="BTC Smart Office (8190)">

<NextTrack keycode="153"/>
<PrevTrack keycode="144"/>
<Play keycode="162"/>
<Stop keycode="164"/>

<VolUp keycode="176" adj="2"/>
<VolDown keycode="174" adj="2"/>
<Mute keycode="160"/>
<userdef keycode="231" command="/usr/bin/myscript/cdem">CDchange</userdef>
<userdef keycode="223" command="/usr/bin/myscript/cdem">CDchange</userdef>
<userdef keycode="222" command="/usr/bin/myscript/cdem">CDchange</userdef>
</config>

<contributor>
<name>Petrisor Eddy Marian</name>
<email>marian.petrisor@siemens.com</email>
</contributor>

</definition>
\end{lstlisting}
\lstset{language=}



\subsection{Другие программы использования мультимедийных кнопок в Linux}
На этом история не заканчивается - есть и другие приёмы работы с мультимедийными кнопками. На никс-форуме советовали для борьбы с клавиатурами обратить внимание на следующие программы:
1) keytouch - это, думаю, лучшее, что есть, но, возможно, вы не найдёте среди поддерживаемых свою клавиатуру;
2) sven - глючная, собирать из исходников надо, когда устанавливаешь. Правда, включает в себя многие вкусности, которые у меня не заработали.
3) xmodmap - подключаем клавиатуры через xmodmap ~/.xmodmaprc, в ~/.xmodmaprc в свою очередь прописываем сопоставления функций кодам клавиш, все замечательно. Один из подходов к использованию мультимедийных кнопок с использованием xmodmap дан здесь.

